package pfc.aviloc.aplicacion.medicamentos;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import pfc.aviloc.R;
import android.content.Context;
import android.util.Log;


public class MedicamentosParseador extends DefaultHandler {
	
	ArrayList<Medicamentos> listaMedicamentos;
	Medicamentos medicamento;
	boolean error;
	String tipoError;
	Context context;
	int etiqueta;	
	
	public MedicamentosParseador(Context context) {
		this.context = context;
	}

	public ArrayList<Medicamentos> getMedicamentos(InputSource xml){
		listaMedicamentos = null;
		
		error=false;
		tipoError = context.getString(R.string.m_parseador_error_sin_errores);
		try {
			// Se utiliza SAX para parsear.
			SAXParserFactory spf = SAXParserFactory.newInstance();
			// spf.setValidating(true);
			//spf.setNamespaceAware(true);
			// spf.setFeature("http://xml.org/sax/features/validation" , true);			
			SAXParser sp = spf.newSAXParser();			
			XMLReader xr = sp.getXMLReader();
			xr.setContentHandler(this);
			// Se realiza el parseo.			
			xr.parse(xml);
		} catch (IOException e) {
			error=true;
			tipoError = context.getString(R.string.m_parseador_error_error_de_parseo);
			listaMedicamentos = null;
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			error=true;
			tipoError = context.getString(R.string.m_parseador_error_error_de_parseo);
			listaMedicamentos = null;			
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			error=true;
			tipoError = context.getString(R.string.m_parseador_error_error_de_parseo);
			listaMedicamentos = null;
			// TODO Auto-generated catch block
			e.printStackTrace();
		}        
        
		return listaMedicamentos;
	}
	
	// METODOS PROPIOS DEL DefaultHandler
//	@Override
//	public void startDocument() throws SAXException {
//		//super.startDocument();
//		Log.i("INFO","-->ENTRAMOS EN StartDocument()");				
//	}
//	
//	@Override
//	public void endDocument() throws SAXException {
//		//endDocument();
//		Log.i("INFO","-->ENTRAMOS EN endDocument()");		
//	}
	
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		//super.startElement(uri, localName, qName, attributes);
		//Log.i("INFO","---->ENTRAMOS EN startElement()");
		//Log.i("INFO","-------> uri="+uri+"; localName="+localName+"; qName="+qName+"; Attributes="+attributes+";");
		
		// Entramos en etiqueta <tomamedicamentos>
		if (localName.equals(context.getString(R.string.m_parseador_etiqueta_toma_medicamentos))) {
			etiqueta=R.string.m_parseador_etiqueta_toma_medicamentos;
			//datosPersonales = new CitasMedico();
		}
		// Entramos en etiqueta <listamedicamentos>
		else if (localName.equals(context.getString(R.string.m_parseador_etiqueta_lista_medicamentos))) {
			etiqueta=R.string.m_parseador_etiqueta_lista_medicamentos;
			listaMedicamentos = new ArrayList<Medicamentos>();				
		}
		// Entramos en etiqueta <medicamento>
		else if (localName.equals(context.getString(R.string.m_parseador_etiqueta_medicamento))) {
			etiqueta=R.string.m_parseador_etiqueta_medicamento;
			medicamento = new Medicamentos();			
		}
		// Entramos en etiqueta <idusuario>
		else if (localName.equals(context.getString(R.string.m_parseador_etiqueta_id_medicamento))) {
			etiqueta=R.string.m_parseador_etiqueta_id_medicamento;
		}
		// Entramos en etiqueta <fechaInicio>
		else if (localName.equals(context.getString(R.string.m_parseador_etiqueta_fecha_inicio))) {
			etiqueta=R.string.m_parseador_etiqueta_fecha_inicio;
		}
		// Entramos en etiqueta <fechaFin>
		else if (localName.equals(context.getString(R.string.m_parseador_etiqueta_fecha_fin))) {
			etiqueta=R.string.m_parseador_etiqueta_fecha_fin;
		}
		// Entramos en etiqueta <nombre>
		else if (localName.equals(context.getString(R.string.m_parseador_etiqueta_nombre))) {
			etiqueta=R.string.m_parseador_etiqueta_nombre;
		}
		// Entramos en etiqueta <descripcion>
		else if (localName.equals(context.getString(R.string.m_parseador_etiqueta_descripcion))) {
			etiqueta=R.string.m_parseador_etiqueta_descripcion;
		}
		// Entramos en etiqueta <frecuencia>
		else if (localName.equals(context.getString(R.string.m_parseador_etiqueta_frecuencia))) {
			etiqueta=R.string.m_parseador_etiqueta_frecuencia;
		}
		// Entramos en etiqueta <dosis>
		else if (localName.equals(context.getString(R.string.m_parseador_etiqueta_dosis))) {
			etiqueta=R.string.m_parseador_etiqueta_dosis;
		}
		// Entramos en etiqueta <nota>
		else if (localName.equals(context.getString(R.string.m_parseador_etiqueta_nota))) {
			etiqueta=R.string.m_parseador_etiqueta_nota;
		}		
		// Entramos en etiqueta <error>
		else if (localName.equals(context.getString(R.string.m_parseador_etiqueta_error))) {
			etiqueta=R.string.m_parseador_etiqueta_error;
		}
		// Entramos en etiqueta <tipoerror>
		else if (localName.equals(context.getString(R.string.m_parseador_etiqueta_tipo_error))) {
			etiqueta=R.string.m_parseador_etiqueta_tipo_error;
		}
	}
	
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// TODO Auto-generated method stub
		//super.characters(ch, start, length);
		//Log.i("INFO","---->ENTRAMOS EN characters()");
		String cadena = new String(ch, start, length);
		//Log.i("INFO","-------> ch="+cadena+"; start="+start+"; length="+length+";");
		
		switch (etiqueta){
//		  case R.string.m_parseador_etiqueta_toma_medicamentos:
//			  break;
//		  case R.string.m_parseador_etiqueta_lista_medicamentos:
//			  break;
//		  case R.string.m_parseador_etiqueta_medicamento:
//			  break;
		  case R.string.m_parseador_etiqueta_id_medicamento:
			  medicamento.setId(cadena);
			  break;
		  case R.string.m_parseador_etiqueta_fecha_inicio:
			  medicamento.setFechaInicio(cadena);
			  String[] fechaInicio = cadena.split("-");
			  medicamento.setFechaInicioDia(fechaInicio[0]);
			  medicamento.setFechaInicioMes(fechaInicio[1]);
			  medicamento.setFechaInicioAno(fechaInicio[2]);
			  break;
		  case R.string.m_parseador_etiqueta_fecha_fin:
			  medicamento.setFechaFin(cadena);
			  String[] fechaFin = cadena.split("-");
			  medicamento.setFechaFinDia(fechaFin[0]);
			  medicamento.setFechaFinMes(fechaFin[1]);
			  medicamento.setFechaFinAno(fechaFin[2]);
			  break;
		  case R.string.m_parseador_etiqueta_nombre:
			  medicamento.setNombre(cadena);
			  break;
		  case R.string.m_parseador_etiqueta_descripcion:
			  medicamento.setDescripcion(cadena);
			  break;
		  case R.string.m_parseador_etiqueta_frecuencia:
			  if (cadena.startsWith(context.getString(R.string.m_parseador_respuesta_frecuencia_una_vez)) ){
				  medicamento.setHoraToma(cadena.substring(15, 17));
				  medicamento.setMinutoToma(cadena.substring(18, 19));
				  Log.i("INFO", "HORA TOMA ="+medicamento.getHoraToma()+"-"+medicamento.getMinutoToma());
				  medicamento.setFrecuencia(context.getString(R.string.m_parseador_valor_frecuencia_1));
			  } else if (cadena.startsWith(context.getString(R.string.m_parseador_respuesta_frecuencia_cada_12)) ){
				  medicamento.setFrecuencia(context.getString(R.string.m_parseador_valor_frecuencia_2));
			  } else if (cadena.startsWith(context.getString(R.string.m_parseador_respuesta_frecuencia_cada_8)) ){
				  medicamento.setFrecuencia(context.getString(R.string.m_parseador_valor_frecuencia_3));
			  } else if (cadena.startsWith(context.getString(R.string.m_parseador_respuesta_frecuencia_cada_6)) ){
				  medicamento.setFrecuencia(context.getString(R.string.m_parseador_valor_frecuencia_4));
			  }
			  break;				
		  case R.string.m_parseador_etiqueta_dosis:
			  medicamento.setDosis(cadena);
			  break;
		  case R.string.m_parseador_etiqueta_nota:
			  medicamento.setNota(cadena);
			  break;
		  case R.string.m_parseador_etiqueta_error:
			  if (cadena.equalsIgnoreCase(context.getString(R.string.m_parseador_respuesta_true))) {
				error = true;  
			  } else if (cadena.equalsIgnoreCase(context.getString(R.string.m_parseador_respuesta_false))){
				error = false;			  
			  } else {
				tipoError =context.getString(R.string.m_parseador_error_de_datos_etiqueta_error);
			  }
			  break;
		  case R.string.m_parseador_etiqueta_tipo_error:
			  if (error){
				  tipoError=cadena;
			  }
			  break;
//		  default:
//			  //NADA
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		//super.endElement(uri, localName, qName);
		//Log.i("INFO","---->ENTRAMOS EN endElement()");
		//Log.i("INFO","-------> uri="+uri+"; localName="+localName+"; qName="+qName+";");
		// Entramos en etiqueta <listamedicamentos>
		if (localName.equals(context.getString(R.string.m_parseador_etiqueta_lista_medicamentos))) {
			if (error){
				listaMedicamentos = null;
			}			
		} 
		// Entramos en etiqueta <medicamento>
		else if (localName.equals(context.getString(R.string.m_parseador_etiqueta_medicamento))) {
			Date fechaActual = new Date();
			medicamento.setFechaActualizacion( fechaActual.getDate()+"-"+(fechaActual.getMonth()+1)+"-"+(fechaActual.getYear()+1900)+" "+fechaActual.getHours()+":"+fechaActual.getMinutes());
			listaMedicamentos.add(medicamento);
		} else {
			etiqueta = -1;
		}			
	}
}
